package com.kylin.common.core.service;

import com.kylin.common.core.entity.DataEntity;
import com.kylin.common.core.entity.Page;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 通用增删改查服务接口
 *
 * @author wuhao
 * @version 1.0 - 2019-06-04
 */
public interface DataService<T extends DataEntity<?>> extends BaseService<T> {

    /**
     * 根据ID查询对象
     * @param id 主键ID
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    T getById(Serializable id);

    /**
     * 获取单个对象
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    T get(T entity);

    /**
     * 根据条件获取list结果
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    List<T> list(T entity);

    /**
     * 分页查询
     * @param page 分页
     * @param entity 查询条件实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    Page<T> listPage(Page<T> page, T entity);

    /**
     * 新增数据
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int insert(T entity);

    /**
     * 更新数据
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int update(T entity);

    /**
     * 保存数据
     * 如果数据库没有就新增，有则更新
     * @param entity 实体对象
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int save(T entity);

    /**
     * 删除数据
     * @param id 编号ID
     * @return
     * @version 1.0  by wuhao at 2019-03-12
     */
    int delete(Serializable id);

    /**
     * 更新状态
     * @param id 主键ID
     * @param status 状态
     * @return
     * @version 1.0  by wuhao at 2019-08-13
     */
    int updateStatus(Long id, String status);

    /**
     * 根据 columnMap 条件，删除记录
     * @param columnMap 表字段 map 对象
     * @return
     * @since 2.2.5 by wuhao at 2020/9/1
     */
    int removeByMap(Map<String, Object> columnMap);


    /**
     * 批量新增数据
     * @param entityList 数据列表
     * @return
     * @version 1.0  by wuhao at 2019/8/26
     */
    int insertBatch(Collection<T> entityList);


    /**
     * 批量新增数据
     * @param entityList 数据列表
     * @param batchSize 每次批量新增的数据量
     * @return
     * @version 1.0  by wuhao at 2019/8/26
     */
    int insertBatch(Collection<T> entityList, int batchSize);

    /**
     * 根据ID 批量更新
     * @param entityList 更新列表
     * @return
     * @version 1.0  by wuhao at 2020-06-26
     */
    int updateBatchById(Collection<T> entityList);

    /**
     * 根据ID 批量更新
     * @param entityList 更新列表
     * @param batchSize  每次更新数量
     * @return
     * @version 1.0  by wuhao at 2020-06-26
     */
    int updateBatchById(Collection<T> entityList, int batchSize);



    /**
     * 批量删除数据
     * @param ids 需要删除的ID列表
     * @return
     * @version 1.0  by wuhao at 2019-03-26
     */
    int deleteBatchIds(List<Serializable> ids);

}
